Bu yazımızda, MySQL veritabanı yapısında tablolar arası birleştirmeler ve veriler arası ilişkileri inceleyeceğiz.
İngilizce JOIN kelimesi, katılmak, birleştirmek anlamlarına gelmektedir. JOIN yapısını veritabanı yapılarında birden fazla tablodaki ilişkili verileri birleştirmek ve anlamlı bütünler oluşturmak için kullanacağız. Ayrıca JOIN yapılacak tabloların, tablolar arası bağlantıyı kuran sütunların, veri tipleri ve veri uzunlukları birbirinden farklı olmamalıdır. Eğer farklıysa JOIN kullanmak sorguyu çok uzatır ve bu da performans açısından sisteme çok yük binmesine sebep olur.
JOIN yapıları 4 farklı şekilde kullanılmaktadır, LEFT JOIN, RIGHT JOIN, INNER JOIN ve CROSS JOIN. Şimdi yapıları inceleyelim.
Dört adet tablomuz olsun. İlki ürün listesi tutan “urun” tablosu, ikinci tablomuz ise ürünlerin detaylarını tutan “urun_detay” tablosu, üçüncü tablo firmamıza kayıtlı olan müşterileri tutacak olan “musteri” tablosu, son tablomuzda müşterilerimize satış yaptığımız ürünlerin kaydını tutan tablo “satis” olsun.
SELECT * FROM `firmam`.`musteri`;
+------------+------------+---------------+-----------------+-------------------------+---------------+
| musteri_id | musteri_ad | musteri_soyad | musteri_telefon | musteri_email | musteri_durum |
+------------+------------+---------------+-----------------+-------------------------+---------------+
| 1 | Jason | DOE | 2129999999 | jason@jasondoe.com | AKTIF |
| 2 | John | DOE | 2127777777 | john@johndoe.com | AKTIF |
| 3 | Jane | DOE | 2128888888 | jane@janedoe.com | DEAKTIF |
+------------+------------+---------------+-----------------+-------------------------+---------------+
6 rows in set
SELECT * FROM `firmam`.`musteri_detay`;
+------------+--------------------+---------------------+--------------------+-------------------------+---------------------+---------------------------+
| musteri_id | musteri_detay_ulke | musteri_detay_sehir | musteri_detay_ilce | musteri_detay_postakodu | musteri_detay_adres | musteri_detay_website |
+------------+--------------------+---------------------+--------------------+-------------------------+---------------------+---------------------------+
| 2 | US | New York | NULL | NULL | NULL | NULL |
| 3 | TR | İstanbul | NULL | NULL | NULL | https://medanis.com.tr |
+------------+--------------------+---------------------+--------------------+-------------------------+---------------------+---------------------------+
2 rows in set
SELECT * FROM `firmam`.`urun`;
+---------+------------------------+------------+------------+-------------+
| urun_id | urun_adi | urun_marka | urun_model | urun_uretim |
+---------+------------------------+------------+------------+-------------+
| 1 | Asus Notebook B43 4GB | Asus | B43 | 2010-04-01 |
| 2 | Asus Notebook N51V 4GB | Asus | N51V | 2009-12-01 |
+---------+------------------------+------------+------------+-------------+
2 rows in set
SELECT * FROM `firmam`.`satis`;
+----------+---------+------------+-------------+--------------+-------------+---------------------+
| satis_id | urun_id | musteri_id | satis_birim | satis_miktar | satis_tutar | satis_tarih |
+----------+---------+------------+-------------+--------------+-------------+---------------------+
| 1 | 1 | 5 | 100 | 40 | 4000 | 2010-12-01 10:00:00 |
| 2 | 1 | 5 | 100 | 10 | 1000 | 2010-12-02 10:00:00 |
| 3 | 1 | 5 | 100 | 40 | 4000 | 2010-12-01 10:00:00 |
| 4 | 1 | 5 | 150 | 10 | 1500 | 2010-12-02 10:00:00 |
| 5 | 1 | 4 | 170 | 10 | 1700 | 2010-12-02 11:00:00 |
| 6 | 1 | 5 | 140 | 10 | 1400 | 2010-12-02 12:00:00 |
| 7 | 1 | 6 | 100 | 10 | 1000 | 2010-12-03 10:00:00 |
| 8 | 2 | 5 | 100 | 30 | 3000 | 2010-12-03 12:00:00 |
| 9 | 2 | 5 | 100 | 20 | 2000 | 2010-12-03 13:00:00 |
| 10 | 2 | 2 | 180 | 10 | 1000 | 2010-12-03 14:00:00 |
| 11 | 2 | 2 | 100 | 10 | 1000 | 2010-12-03 15:00:00 |
| 12 | 2 | 3 | 100 | 30 | 3000 | 2010-12-03 16:41:00 |
| 13 | 2 | 3 | 120 | 20 | 2400 | 2010-12-03 16:58:00 |
| 14 | 2 | 4 | 100 | 30 | 3000 | 2010-12-03 17:15:00 |
| 15 | 2 | 1 | 100 | 10 | 1000 | 2010-12-03 17:30:00 |
+----------+---------+------------+-------------+--------------+-------------+---------------------+
15 rows in set
İlk olarak en yaygın kullanılan JOIN tipi olan INNER JOIN’i inceleyelim. INNER JOIN seçtiğiniz tablolarda birebir eşleşen kayıtları getirir. Örneğin musteri ve musteri_detay tablolarını inceleyecek olursanız 3 adet müşteri kaydımız ve 2 adet müşteri detay kaydımız bulunuyor. Biz bu tablolar için INNER JOIN kullanırsak bize sadece 2 satır kayıt dönecektir. Çünkü her iki tabloda kaydı bulunan musteri sadece 2 tanedir.
SELECT m.*, md.musteri_detay_website
FROM firmam.musteri AS m
INNER JOIN firmam.musteri_detay AS md ON m.musteri_id = md.musteri_id
+------------+------------+---------------+-----------------+-------------------------+---------------+---------------------------+
| musteri_id | musteri_ad | musteri_soyad | musteri_telefon | musteri_email | musteri_durum | musteri_detay_website |
+------------+------------+---------------+-----------------+-------------------------+---------------+---------------------------+
| 2 | John | DOE | 2127777777 | john@johndoe.com | AKTIF | NULL |
| 3 | Jane | DOE | 2128888888 | jane@janedoe.com | DEAKTIF | https://medanis.com.tr |
+------------+------------+---------------+-----------------+-------------------------+---------------+---------------------------+
2 rows in set (0.00 sec)
Diğer dersimizde diğer JOIN kullanımlarını inceleyeceğiz.